//package com.cherrypt.api.core.dao.redis;
//
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.data.redis.connection.RedisServerCommands;
//import org.springframework.data.redis.core.*;
//import org.springframework.data.redis.serializer.RedisSerializer;
//
//import java.nio.charset.Charset;
//import java.util.*;
//
//public class RedisRepository<T> {
//    /**
//     * Logger
//     */
//    private static final Logger logger = LoggerFactory.getLogger(RedisRepository.class);
//
//    /**
//     * 默认编码
//     */
//    private static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
//
//    /**
//     * Spring Redis Template
//     */
//    private RedisTemplate<String, T> redisTemplate;
//
//
//    public RedisRepository(RedisTemplate<String, T> redisTemplate) {
//        this.redisTemplate = redisTemplate;
//    }
//
//    public ValueOperations<String, T> opsForValue() {
//        return redisTemplate.opsForValue();
//    }
//
//    public ListOperations<String, T> opsForList() {
//        return redisTemplate.opsForList();
//    }
//
//    public HashOperations<String, String, T> opsForHash() {
//        return redisTemplate.opsForHash();
//    }
//
//    /**
//     * 获取 RedisSerializer
//     *
//     * @return the redis serializer
//     */
//    private RedisSerializer<?> getRedisSerializer() {
//        return redisTemplate.getDefaultSerializer();
//    }
//
//    /**
//     * 设置key value
//     *
//     * @param key   key
//     * @param value value
//     * @return set true
//     */
//    public Boolean set(String key, String value) {
//        return redisTemplate.execute((RedisCallback<Boolean>) connection -> {
//            return connection.set(key.getBytes(), value.getBytes());
//        });
//    }
//
//    /**
//     * 设置key并设置过期时间
//     *
//     * @param key   key
//     * @param value value
//     * @param exp   过期时间，秒
//     * @return set true
//     */
//    public Boolean set(String key, String value, long exp) {
//        return redisTemplate.execute((RedisCallback<Boolean>) connection -> {
//            return connection.setEx(key.getBytes(), exp, value.getBytes());
//        });
//    }
//
//    /**
//     * 根据key获取value
//     *
//     * @param key key
//     * @return the value
//     */
//    public String get(String key) {
//        return redisTemplate.execute((RedisCallback<String>) connection -> {
//            byte[] data = connection.get(key.getBytes());
//            if (data == null) {
//                return null;
//            }
//            return new String(data);
//        });
//    }
//
//    /**
//     * 存储object
//     *
//     * @param key key
//     * @param o   object
//     * @return save true
//     */
//    public Boolean setObj(String key, T o) {
//        return redisTemplate.execute((RedisCallback<Boolean>) connection -> {
//            RedisSerializer<T> redisSerializer = (RedisSerializer<T>) getRedisSerializer();
//            byte[] data = redisSerializer.serialize(o);
//            return connection.set(key.getBytes(), data);
//        });
//    }
//
//    /**
//     * 存储object
//     *
//     * @param key key
//     * @param o   object
//     * @param exp 过期时间
//     * @return save true
//     */
//    public Boolean setObjEx(String key, T o, long exp) {
//        return redisTemplate.execute((RedisCallback<Boolean>) connection -> {
//            RedisSerializer<Object> redisSerializer = (RedisSerializer<Object>) getRedisSerializer();
//            byte[] data = redisSerializer.serialize(o);
//            return connection.setEx(key.getBytes(), exp, data);
//        });
//    }
//
//    /**
//     * 获取object
//     *
//     * @param key key
//     * @return object
//     */
//    public T getObj(String key) {
//        return redisTemplate.execute((RedisCallback<T>) connection -> {
//            RedisSerializer<T> redisSerializer = (RedisSerializer<T>) getRedisSerializer();
//            byte[] data = connection.get(key.getBytes());
//            if (data == null) {
//                return null;
//            }
//            return redisSerializer.deserialize(data);
//        });
//    }
//
//
//    /**
//     * 自增1并设置key的过期时间
//     *
//     * @param key key
//     * @param exp 过期时间
//     * @return true成功
//     */
//    public Boolean incrExpire(String key, Long exp) {
//        return redisTemplate.execute((RedisCallback<Boolean>) connection -> {
//            connection.incr(key.getBytes());
//            return connection.expire(key.getBytes(), exp);
//        });
//    }
//
//    /**
//     * 设置key的过期时间
//     *
//     * @param key key
//     * @param exp 秒
//     */
//    public Boolean expire(String key, Long exp) {
//        return redisTemplate.execute((RedisCallback<Boolean>) connection -> {
//            return connection.expire(key.getBytes(), exp);
//        });
//    }
//
//    /**
//     * 查询在以keyPatten的所有  key
//     *
//     * @param keyPatten the key patten
//     * @return the set
//     */
//    public Set<String> keys(String keyPatten) {
//        return redisTemplate.execute((RedisCallback<Set<String>>) connection -> redisTemplate.keys(keyPatten + "*"));
//    }
//
//    /**
//     * 集合数量
//     *
//     * @return the long
//     */
//    public Long dbSize() {
//        return redisTemplate.execute(RedisServerCommands::dbSize);
//    }
//
//    /**
//     * 清空redis存储的数据
//     *
//     * @return the string
//     */
//    public String flushDB() {
//        return redisTemplate.execute((RedisCallback<String>) connection -> {
//            connection.flushDb();
//            return "ok";
//        });
//    }
//
//    /**
//     * 判断某个主键是否存在
//     *
//     * @param key the key
//     * @return the boolean
//     */
//    public Boolean exists(String key) {
//        return redisTemplate.execute((RedisCallback<Boolean>) connection -> connection.exists(key.getBytes(DEFAULT_CHARSET)));
//    }
//
//    /**
//     * 删除key
//     *
//     * @param keys the keys
//     * @return the long
//     */
//    public Long del(String... keys) {
//        return redisTemplate.execute((RedisCallback<Long>) connection -> {
//            Long result = 0L;
//            for (String key : keys) {
//                result = connection.del(key.getBytes());
//            }
//            return result;
//        });
//    }
//}
